<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<meta name="theme-color" content="#222"><meta name="generator" content="Hexo 6.3.0">

  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png">
  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png">
  <link rel="mask-icon" href="/images/logo.svg" color="#222">

<link rel="stylesheet" href="/css/main.css">



<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css" integrity="sha256-AbA177XfpSnFEvgpYu1jMygiLabzPCJCRIBtR5jGc0k=" crossorigin="anonymous">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.1.1/animate.min.css" integrity="sha256-PR7ttpcvz8qrF57fur/yAx1qXMFJeJFiA6pSzWi0OIE=" crossorigin="anonymous">

<script class="next-config" data-name="main" type="application/json">{"hostname":"fengxun2017.github.io","root":"/","images":"/images","scheme":"Muse","darkmode":false,"version":"8.13.2","exturl":false,"sidebar":{"position":"right","display":"hide","padding":18,"offset":12},"copycode":{"enable":false,"style":null},"bookmark":{"enable":false,"color":"#222","save":"auto"},"mediumzoom":false,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"stickytabs":false,"motion":{"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"fadeInDown","post_body":"fadeInDown","coll_header":"fadeInLeft","sidebar":"fadeInUp"}},"prism":false,"i18n":{"placeholder":"搜索...","empty":"没有找到任何搜索结果：${query}","hits_time":"找到 ${hits} 个搜索结果（用时 ${time} 毫秒）","hits":"找到 ${hits} 个搜索结果"}}</script><script src="/js/config.js"></script>

    <meta name="description" content="Renesas学习笔记CPU System : CPU -  Exceptions and Interrupts">
<meta property="og:type" content="article">
<meta property="og:title" content="Renesas-RH850  CPU System - CPU -  Exceptions and Interrupts">
<meta property="og:url" content="http://fengxun2017.github.io/2025/01/04/Renesas-CPU_System-CPU-Exceptions_and_Interrupts/index.html">
<meta property="og:site_name" content="fx">
<meta property="og:description" content="Renesas学习笔记CPU System : CPU -  Exceptions and Interrupts">
<meta property="og:locale" content="zh_CN">
<meta property="article:published_time" content="2025-01-03T16:00:00.000Z">
<meta property="article:modified_time" content="2025-01-05T09:52:00.664Z">
<meta property="article:author" content="feng xun">
<meta name="twitter:card" content="summary">


<link rel="canonical" href="http://fengxun2017.github.io/2025/01/04/Renesas-CPU_System-CPU-Exceptions_and_Interrupts/">



<script class="next-config" data-name="page" type="application/json">{"sidebar":"","isHome":false,"isPost":true,"lang":"zh-CN","comments":true,"permalink":"http://fengxun2017.github.io/2025/01/04/Renesas-CPU_System-CPU-Exceptions_and_Interrupts/","path":"2025/01/04/Renesas-CPU_System-CPU-Exceptions_and_Interrupts/","title":"Renesas-RH850  CPU System - CPU -  Exceptions and Interrupts"}</script>

<script class="next-config" data-name="calendar" type="application/json">""</script>
<title>Renesas-RH850  CPU System - CPU -  Exceptions and Interrupts | fx</title>
  






  <script async defer data-website-id="" src=""></script>

  <script defer data-domain="" src=""></script>

  <noscript>
    <link rel="stylesheet" href="/css/noscript.css">
  </noscript>
  <a target="_blank" rel="noopener" href="https://github.com/fengxun2017" class="github-corner" aria-label="View source on GitHub"><svg width="80" height="80" viewBox="0 0 250 250" style="fill:#70B7FD; color:#fff; position: absolute; top: 0; border: 0; right: 0;" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a><style>.github-corner:hover .octo-arm{animation:octocat-wave 560ms ease-in-out}@keyframes octocat-wave{0%,100%{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@media (max-width:500px){.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave 560ms ease-in-out}}</style>
</head>

<body itemscope itemtype="http://schema.org/WebPage" class="use-motion">
  <div class="headband"></div>

  <main class="main">
    <header class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-container">
  <div class="site-nav-toggle">
    <div class="toggle" aria-label="切换导航栏" role="button">
        <span class="toggle-line"></span>
        <span class="toggle-line"></span>
        <span class="toggle-line"></span>
    </div>
  </div>

  <div class="site-meta">

    <a href="/" class="brand" rel="start">
      <i class="logo-line"></i>
      <p class="site-title">fx</p>
      <i class="logo-line"></i>
    </a>
      <p class="site-subtitle" itemprop="description">FreeRTOS交流QQ群-663806972 BLE学习交流群-498676838</p>
  </div>

  <div class="site-nav-right">
    <div class="toggle popup-trigger">
    </div>
  </div>
</div>



<nav class="site-nav">
  <ul class="main-menu menu"><li class="menu-item menu-item-home"><a href="/" rel="section"><i class="fa fa-home fa-fw"></i>首页</a></li><li class="menu-item menu-item-categories"><a href="/categories/" rel="section"><i class="fa fa-th fa-fw"></i>分类</a></li>
  </ul>
</nav>




</div>
        
  
  <div class="toggle sidebar-toggle" role="button">
    <span class="toggle-line"></span>
    <span class="toggle-line"></span>
    <span class="toggle-line"></span>
  </div>

  <aside class="sidebar">

    <div class="sidebar-inner sidebar-nav-active sidebar-toc-active">
      <ul class="sidebar-nav">
        <li class="sidebar-nav-toc">
          文章目录
        </li>
        <li class="sidebar-nav-overview">
          站点概览
        </li>
      </ul>

      <div class="sidebar-panel-container">
        <!--noindex-->
        <div class="post-toc-wrap sidebar-panel">
            <div class="post-toc animated"><ol class="nav"><li class="nav-item nav-level-5"><a class="nav-link" href="#1-%E5%BC%82%E5%B8%B8%E6%A6%82%E8%BF%B0"><span class="nav-number">1.</span> <span class="nav-text">1 异常概述</span></a><ol class="nav-child"><li class="nav-item nav-level-6"><a class="nav-link" href="#1-1-%E5%BC%82%E5%B8%B8%E5%8E%9F%E5%9B%A0%E6%A6%82%E8%BF%B0%EF%BC%9A"><span class="nav-number">1.1.</span> <span class="nav-text">1.1 异常原因概述：</span></a></li><li class="nav-item nav-level-6"><a class="nav-link" href="#1-2-%E5%BC%82%E5%B8%B8%E7%B1%BB%E5%9E%8B"><span class="nav-number">1.2.</span> <span class="nav-text">1.2 异常类型</span></a></li><li class="nav-item nav-level-6"><a class="nav-link" href="#1-3-%E5%BC%82%E5%B8%B8%E7%A1%AE%E8%AE%A4%E6%9D%A1%E4%BB%B6%E5%92%8C%E4%BC%98%E5%85%88%E7%BA%A7%E9%A1%BA%E5%BA%8F"><span class="nav-number">1.3.</span> <span class="nav-text">1.3 异常确认条件和优先级顺序</span></a></li><li class="nav-item nav-level-6"><a class="nav-link" href="#1-4-%E4%B8%AD%E6%96%AD%E5%BC%82%E5%B8%B8%E4%BC%98%E5%85%88%E7%BA%A7%E5%92%8C%E4%BC%98%E5%85%88%E7%BA%A7%E5%B1%8F%E8%94%BD"><span class="nav-number">1.4.</span> <span class="nav-text">1.4 中断异常优先级和优先级屏蔽</span></a></li><li class="nav-item nav-level-6"><a class="nav-link" href="#1-5-%E8%BF%94%E5%9B%9E%E5%92%8C%E6%81%A2%E5%A4%8D"><span class="nav-number">1.5.</span> <span class="nav-text">1.5 返回和恢复</span></a></li><li class="nav-item nav-level-6"><a class="nav-link" href="#1-6-%E4%B8%8A%E4%B8%8B%E6%96%87%E4%BF%9D%E5%AD%98"><span class="nav-number">1.6.</span> <span class="nav-text">1.6  上下文保存</span></a></li></ol></li><li class="nav-item nav-level-5"><a class="nav-link" href="#2-%E7%A1%AE%E8%AE%A4%E5%BC%82%E5%B8%B8%E6%97%B6%E7%9A%84%E6%93%8D%E4%BD%9C"><span class="nav-number">2.</span> <span class="nav-text">2 确认异常时的操作</span></a><ol class="nav-child"><li class="nav-item nav-level-6"><a class="nav-link" href="#2-1-%E7%89%B9%E6%AE%8A%E6%93%8D%E4%BD%9C"><span class="nav-number">2.1.</span> <span class="nav-text">2.1 特殊操作</span></a></li></ol></li><li class="nav-item nav-level-5"><a class="nav-link" href="#3-%E4%BB%8E%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86%E4%B8%AD%E8%BF%94%E5%9B%9E"><span class="nav-number">3.</span> <span class="nav-text">3 从异常处理中返回</span></a></li><li class="nav-item nav-level-5"><a class="nav-link" href="#4-%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86%E7%A8%8B%E5%BA%8F%E5%9C%B0%E5%9D%80"><span class="nav-number">4.</span> <span class="nav-text">4 异常处理程序地址</span></a><ol class="nav-child"><li class="nav-item nav-level-6"><a class="nav-link" href="#4-1-%E5%A4%8D%E4%BD%8D%E3%80%81%E5%BC%82%E5%B8%B8%E5%92%8C%E4%B8%AD%E6%96%AD"><span class="nav-number">4.1.</span> <span class="nav-text">4.1 复位、异常和中断</span></a></li><li class="nav-item nav-level-6"><a class="nav-link" href="#4-2-%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8"><span class="nav-number">4.2.</span> <span class="nav-text">4.2 系统调用</span></a></li></ol></li><li class="nav-item nav-level-5"><a class="nav-link" href="#5-%E5%AF%84%E5%AD%98%E5%99%A8%E7%BB%84%E5%8A%9F%E8%83%BD"><span class="nav-number">5.</span> <span class="nav-text">5 寄存器组功能</span></a><ol class="nav-child"><li class="nav-item nav-level-6"><a class="nav-link" href="#5-1-%E5%AF%84%E5%AD%98%E5%99%A8%E7%BB%84%E5%8A%9F%E8%83%BD%E6%A6%82%E8%BF%B0"><span class="nav-number">5.1.</span> <span class="nav-text">5.1 寄存器组功能概述</span></a></li><li class="nav-item nav-level-6"><a class="nav-link" href="#5-2-%E8%87%AA%E5%8A%A8%E4%B8%8A%E4%B8%8B%E6%96%87%E4%BF%9D%E5%AD%98"><span class="nav-number">5.2.</span> <span class="nav-text">5.2 自动上下文保存</span></a></li><li class="nav-item nav-level-6"><a class="nav-link" href="#5-3-%E4%B8%8A%E4%B8%8B%E6%96%87%E6%81%A2%E5%A4%8D"><span class="nav-number">5.3.</span> <span class="nav-text">5.3 上下文恢复</span></a></li></ol></li><li class="nav-item nav-level-5"><a class="nav-link" href="#6-%E5%86%85%E5%AD%98%E8%AE%BF%E9%97%AE%E5%BC%82%E5%B8%B8%E5%88%97%E8%A1%A8"><span class="nav-number">6.</span> <span class="nav-text">6 内存访问异常列表</span></a></li></ol></div>
        </div>
        <!--/noindex-->

        <div class="site-overview-wrap sidebar-panel">
          <div class="site-author site-overview-item animated" itemprop="author" itemscope itemtype="http://schema.org/Person">
  <p class="site-author-name" itemprop="name">feng xun</p>
  <div class="site-description" itemprop="description">FreeRTOS交流QQ群-663806972 BLE学习交流群-498676838</div>
</div>
<div class="site-state-wrap site-overview-item animated">
  <nav class="site-state">
      <div class="site-state-item site-state-posts">
        <a href="/archives/">
          <span class="site-state-item-count">96</span>
          <span class="site-state-item-name">日志</span>
        </a>
      </div>
      <div class="site-state-item site-state-categories">
          <a href="/categories/">
        <span class="site-state-item-count">16</span>
        <span class="site-state-item-name">分类</span></a>
      </div>
  </nav>
</div>
  <div class="cc-license site-overview-item animated" itemprop="license">
    <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh" class="cc-opacity" rel="noopener" target="_blank"><img src="https://cdnjs.cloudflare.com/ajax/libs/creativecommons-vocabulary/2020.11.3/assets/license_badges/small/by_nc_sa.svg" alt="Creative Commons"></a>
  </div>



        </div>
      </div>
    </div>
  </aside>
  <div class="sidebar-dimmer"></div>


    </header>

    
  <div class="back-to-top" role="button" aria-label="返回顶部">
    <i class="fa fa-arrow-up"></i>
    <span>0%</span>
  </div>

<noscript>
  <div class="noscript-warning">Theme NexT works best with JavaScript enabled</div>
</noscript>


    <div class="main-inner post posts-expand">


  


<div class="post-block">
  
  

  <article itemscope itemtype="http://schema.org/Article" class="post-content" lang="zh-CN">
    <link itemprop="mainEntityOfPage" href="http://fengxun2017.github.io/2025/01/04/Renesas-CPU_System-CPU-Exceptions_and_Interrupts/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="feng xun">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="fx">
      <meta itemprop="description" content="FreeRTOS交流QQ群-663806972 BLE学习交流群-498676838">
    </span>

    <span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
      <meta itemprop="name" content="Renesas-RH850  CPU System - CPU -  Exceptions and Interrupts | fx">
      <meta itemprop="description" content="">
    </span>
      <header class="post-header">
        <h1 class="post-title" itemprop="name headline">
          Renesas-RH850  CPU System - CPU -  Exceptions and Interrupts
        </h1>

        <div class="post-meta-container">
          <div class="post-meta">
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar"></i>
      </span>
      <span class="post-meta-item-text">发表于</span>

      <time title="创建时间：2025-01-04 00:00:00" itemprop="dateCreated datePublished" datetime="2025-01-04T00:00:00+08:00">2025-01-04</time>
    </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-folder"></i>
      </span>
      <span class="post-meta-item-text">分类于</span>
        <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
          <a href="/categories/Renesas/" itemprop="url" rel="index"><span itemprop="name">Renesas</span></a>
        </span>
    </span>

  
    <span class="post-meta-break"></span>
    <span class="post-meta-item" title="本文字数">
      <span class="post-meta-item-icon">
        <i class="far fa-file-word"></i>
      </span>
      <span class="post-meta-item-text">本文字数：</span>
      <span>13k</span>
    </span>
    <span class="post-meta-item" title="阅读时长">
      <span class="post-meta-item-icon">
        <i class="far fa-clock"></i>
      </span>
      <span class="post-meta-item-text">阅读时长 &asymp;</span>
      <span>16 分钟</span>
    </span>
</div>

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">
        <center>

<p>Renesas学习笔记<br>CPU System : CPU -  Exceptions and Interrupts</p>
</center>

<span id="more"></span>

<hr>
<p>本章介绍此CPU上的异常和中断</p>
<p>异常是一种特定事件，会强制将操作从当前程序跳转到另一个程序。<br>给定异常的跳转目标程序称为“异常处理程序”。</p>
<p>注意： 该 CPU 将中断作为异常的一种类型处理。</p>
<h5 id="1-异常概述"><a href="#1-异常概述" class="headerlink" title="1 异常概述"></a>1 异常概述</h5><p>本节描述异常的工作原理。</p>
<h6 id="1-1-异常原因概述："><a href="#1-1-异常原因概述：" class="headerlink" title="1.1 异常原因概述："></a>1.1 异常原因概述：</h6><p>以下是 CPU 处理的异常原因概述。</p>
<ul>
<li><p>RESET：当输入重置信号时生成 RESET。详见第 3.2.8 节，重置。</p>
</li>
<li><p>FENMI、FEINT 和 EIINT：这些是由中断控制器的中断信号生成的中断，以激活某个程序。</p>
</li>
<li><p>SYSERR：这是一个系统错误异常。<br>在使用寄存器组功能自动保存上下文期间发生的错误会作为终止型 SYSERR 异常通知。在这种情况下，与确认中断的情况一样，异常发生时中断的指令的 PC 被加载到 FEPC 中，当时的 PSW 被加载到 FEPSW 中。使用 RESBANK 指令恢复上下文时发生的错误会作为可恢复型 SYSERR 异常通知。在这种情况下，RESBANK 指令的 PC 被加载到 FEPC 中，当时的 PSW 被加载到 FEPSW 中。<br>指令取回访问时发生的错误会作为可恢复型 SYSERR 异常通知。在这种情况下，待取回指令的 PC 被加载到 FEPC 中，当时的 PSW 被加载到 FEPSW 中。<br>与 SYSERR 异常相关的异常原因代码低 16 位：</p>
<table>
<thead>
<tr>
<th>异常原因代码</th>
<th>原因</th>
</tr>
</thead>
<tbody><tr>
<td>11H</td>
<td>指令取回时总线从设备发生响应错误*1</td>
</tr>
<tr>
<td>13H</td>
<td>指令取回时发生的安全功能范围内的错误（如 ECC 错误或奇偶校验错误）</td>
</tr>
<tr>
<td>1CH</td>
<td>自动将上下文保存到寄存器组时发生错误</td>
</tr>
<tr>
<td>1DH</td>
<td>从寄存器组恢复上下文时发生错误（执行 RESBANK 指令期间）</td>
</tr>
</tbody></table>
<p>  当从指令缓存中取回时发现 ECC 或奇偶校验错误时，它会被处理为缓存未命中，因此不会发生 SYSERR 异常。</p>
</li>
<li><p>FPE：这是在执行浮点指令时发生的异常。详见第 3.2.6.1 节，浮点操作。</p>
</li>
<li><p>FXE：这是在执行扩展浮点指令时发生的异常。详见第 3.2.6.2 节，扩展浮点操作。</p>
</li>
<li><p>MIP 和 MDP：这是在 MPU 检测到违规时发生的异常。在计算指令将访问内存的地址时执行异常检测。详见第 3.2.5.1 节，内存保护单元 (MPU)。<br>在优先级确定结果中选择表引用方法中断 (EIINTn) 后，在执行表读取或自动保存上下文到寄存器组期间检测到 MDP 异常。在这种情况下，中断指令的执行并生成 MDP 异常（终止型），与普通中断相同。在这种情况下，中断指令的 PC 被保存到 FEPC 中，中断接受前建立的 PSW 被保存到 FEPSW 中。有关表引用方法的详细信息，请参见第 3.2.4.4 节，异常处理程序地址。</p>
</li>
<li><p>RIE：这是一个保留指令异常。当尝试执行操作未定义的指令的操作码时，会发生此异常。操作与 RIE 指令相同。有关保留指令和 RIE 指令的详细信息，请参见 RH850G4MH 用户手册：软件。</p>
</li>
<li><p>PIE：这是一个特权指令异常。当尝试执行没有所需特权的指令时，会发生此异常。</p>
</li>
<li><p>UCPOP：这是在尝试执行不可用协处理器指令时发生的异常。</p>
</li>
<li><p>MAE：这是在地址计算结果未对齐时发生的异常。</p>
</li>
<li><p>TRAP、FETRAP 和 SYSCALL：这些是根据指令执行结果发生的异常。有关详细信息，请参见 RH850G4MH 用户手册：软件。</p>
</li>
</ul>
<h6 id="1-2-异常类型"><a href="#1-2-异常类型" class="headerlink" title="1.2 异常类型"></a>1.2 异常类型</h6><p>该 CPU 根据异常的执行方式将其分为以下三种类型：</p>
<ul>
<li>终止型异常</li>
<li>可恢复型异常</li>
<li>挂起型异常</li>
</ul>
<p>(a) 终止型异常：<br>对于此类型的异常，通过在当前指令的操作执行之前中断其来确认异常。这些异常包括中断等。</p>
<p>对于中断而言，它们的发生不依赖于当前指令的执行结果，即生成与该指令无关。当发生中断时，PSW.EP 位会被清除为 0，不同于其他异常。因此，当返回指令被执行时，异常处理程序例程的终止会报告给外部中断控制器。确保在 PSW.EP 位清除为 0 时从中断执行返回指令。</p>
<p>注意事项：</p>
<ul>
<li><p>只有在确认中断（EIINTn、FEINT 或 FENMI）时，PSW.EP 位才会被清除为 0。当发生任何其他异常时，它被设置为 1。如果在 PSW.EP 位设置为 1 时执行从中断启动的异常处理程序例程的返回指令，外部中断控制器上的资源可能不会被释放，导致故障。</p>
</li>
<li><p>在执行执行多个内存访问的指令时，可能会接受终止型异常。在这种情况下，尽管指令的执行被终止，但已完成的内存访问结果不会被取消。例如，内存通过 PREPARE 指令更新，通用寄存器通过 DISPOSE 指令更新。但是，可以保证 PC 和 SP 保留重新执行指令所需的原始值。有关详细信息，请参见 RH850G4MH 用户手册：软件。相关指令如下：PREPARE、DISPOSE、PUSHSP、POPSP、RESBANK、STM.MP、LDM.MP。</p>
</li>
<li><p>对于执行加载访问和分支的指令，加载访问完成后可能会接受终止型异常。然而，保证完成指令后更新的 PC 和系统寄存器（如 CTPC）保留重新执行指令所需的原始值。有关详细信息，请参见 RH850G4MH 用户手册：软件。相关指令如下：CALLT、SYSCALL、SWITCH。</p>
</li>
</ul>
<p>(b) 可恢复型异常<br>可恢复型异常是在指令操作期间发生的异常，并在未完成该指令的情况下被接受。它也称为精确异常，因为它在未完成正在执行的指令且未执行后续指令的情况下被精确地接受。此异常的发生抑制了通用寄存器和系统寄存器的更新。此外，<strong>由于异常的返回 PC 指向导致异常的指令，因此可以在发生异常前的点恢复执行</strong>。</p>
<p>可恢复型异常的返回 PC 是导致异常的指令的 PC（当前 PC）。</p>
<p>(c) 挂起型异常<br>这是在指令执行完成后确认的异常，作为执行指令操作的结果。挂起型异常包括软件异常。由于挂起型异常是正常指令执行的结果，因此当处理控制返回时，处理从导致挂起异常的指令的下一指令恢复。异常处理后，原始处理可以正常继续。</p>
<p>挂起型异常的返回 PC 是下一指令的 PC（下一 PC）。</p>
<h6 id="1-3-异常确认条件和优先级顺序"><a href="#1-3-异常确认条件和优先级顺序" class="headerlink" title="1.3 异常确认条件和优先级顺序"></a>1.3 异常确认条件和优先级顺序</h6><p>此 CPU 在特定时机基于异常确认条件和优先级顺序仅确认一个异常。待确认的异常基于异常确认条件和优先级顺序确定。</p>
<p>在表 3.102 中，确认条件列为“0”的异常，当对应位为“0”时可以被确认。当对应位为“1”时，这类异常不被接受。当它变为“0”并且满足确认条件时，异常确认变得可能。如果位上没有指定值，则不是确认条件。如果多个位被指定为条件，则必须同时满足所有条件。</p>
<p>某些异常具有专门的掩码功能，独特于其功能。基于单独定义的掩码功能对异常可接受性的决策在表 3.102 中列出的确认（接受）条件之前进行。有关详细信息，请参见各个异常原因的描述。</p>
<p>如果两个以上的异常同时满足确认条件，根据优先级顺序选择一个异常。优先级顺序在多个阶段确定；优先级级别，然后是优先级。数值越小，优先级越高。</p>
<p>当此 CPU 接受一个异常时，它会向请求模块返回接受响应。</p>
<p>如果终止型异常未被接受，CPU 不会将该异常请求挂起。为了保持异常请求挂起以供接受，发出终止型异常请求到 CPU 的模块（如中断控制器）会将异常请求挂起。</p>
<p>与重置同时发生的任何异常都不被接受。有关详细信息，请参见第 3.2.4.2 (1) 节，特殊操作。</p>
<h6 id="1-4-中断异常优先级和优先级屏蔽"><a href="#1-4-中断异常优先级和优先级屏蔽" class="headerlink" title="1.4 中断异常优先级和优先级屏蔽"></a>1.4 中断异常优先级和优先级屏蔽</h6><p>通过设置寄存器，可以根据每个异常优先级或中断优先级屏蔽中断（EIINTn）。此功能允许在不需要维护的情况下，以更灵活的软件结构实现中断上限。图 3.17 显示了中断异常优先级和优先级屏蔽功能的概述。</p>
<p>(a) 中断优先级<br>此 CPU 支持以下中断（EIINTn）优先级级别：</p>
<ul>
<li><p>当中断优先级级别扩展功能被禁用（INTCFG.EPL 被清除为 0）：最大 16 个优先级级别。</p>
</li>
<li><p>当中断优先级级别扩展功能被启用（INTCFG.EPL 被设置为 1）：最大 64 个优先级级别。 有关设置中断优先级的详细步骤，请参见第 6 节，中断。</p>
</li>
</ul>
<p>(i) 当中断优先级级别扩展被禁用时（INTCFG.EPL 被清除为 0），发生优先级级别为 16 到 63 的中断：</p>
<ul>
<li>此时中断（EIINTn）的确认功能有限。中断可以通过 ISPR 和 PLMR 屏蔽。如果 ISPR 的任意一个位被设置为 1，则所有优先级低于或等于 16 的中断（EIINTn）被屏蔽。PLMR 始终根据设置值和中断优先级级别判断确认，而不管中断优先级级别扩展功能的设置如何。另一方面，接受到的中断（EIINTn）的优先级信息不会保存在 ISPR 和 PSW.EIMASK 中。因此，尽管可能确认中断（EIINTn），但不推荐使用这种方式，因为 CPU 不处理优先级信息。</li>
</ul>
<p>(ii) 优先级级别为 16 到 62 的中断的约束：无论中断优先级级别扩展功能是启用还是禁用，以下约束对优先级级别为 16 到 62 的中断（EIINTn）有效：</p>
<ul>
<li><p>当接受到的中断（EIINTn）优先级在 16 到 62 之间，并且异常处理程序地址通过直接向量地址方法生成时，偏移地址为 1F0H，这与优先级为 15 的中断相同。因此，优先级低于或等于 15 的所有中断（EIINTn）使用相同的异常处理程序地址。有关详细信息，请参见第 3.2.4.4 节，异常处理程序地址。</p>
</li>
<li><p>当接受到的中断（EIINTn）优先级在 16 到 62 之间时，寄存器组的可用性由 RBCR0. BE[15] 指定，这与优先级为 15 的中断相同。优先级低于或等于 15 的所有中断（EIINTn），寄存器组的可用性不能按优先级级别指定。有关详细信息，请参见第 3.2.4.5 (2) 节，自动上下文保存。</p>
</li>
<li><p>当接受到的中断（EIINTn）优先级在 16 到 62 之间时，PSW. ID 位的值在保存到寄存器组后由 RBCR1. NC[15] 指定，这与优先级为 15 的情况相同。优先级低于或等于 15 的所有中断（EIINTn），在保存到寄存器组后，PSW. ID 位的值不能按优先级级别指定。有关详细信息，请参见第 3.2.4.5(2)(b) 节，抑制 PSW. ID 位的更新。</p>
</li>
</ul>
<p>(iii) 优先级级别为 63 的中断的约束<br>如果中断优先级级别扩展功能被禁用，则优先级级别为 63（最低优先级级别）的中断（EIINTn）将始终被 PLMR 屏蔽。如果中断优先级级别扩展功能被启用，则优先级级别为 63（最低优先级级别）的中断（EIINTn）将始终被 PSW.EIMASK 屏蔽。因此，无论中断优先级级别扩展功能是否启用，优先级级别为 63 的中断（EIINTn）都不被接受。<strong>但 HALT 指令引起的停止状态和 SNOOZE 指令引起的临时暂停状态可以通过发生优先级级别为 63 的中断释放。</strong></p>
<p>(b) 中断优先级屏蔽<br>如果中断优先级级别扩展功能被禁用（INTCFG.EPL 被清除为 0），中断（EIINTn）的确认通过 ISPR 和 PLMR 判断。如果中断优先级级别扩展功能被启用（INTCFG.EPL 被设置为 1），中断（EIINTn）的确认通过 PSW.EIMASK 和 PLMR 判断。</p>
<p>(i) ISPR<br>只有在中断优先级级别扩展功能被禁用时，中断确认由 ISPR 判断。 对于 ISPR 寄存器，当硬件确认中断时，对应优先级的位被设置为 1，并屏蔽相同或较低优先级的中断。当执行与中断对应的 EIRET 指令时，ISPR 寄存器的相应位被清除为 0，以清除屏蔽。 这种自动中断上限使得多个中断服务变得容易，无需使用软件控制。 INTCFG 寄存器的功能允许在确认和返回中断时禁用 ISPR 寄存器的自动更新。要在不使用 ISPR 寄存器功能的情况下通过软件执行中断上限控制，请将 INTCFG 寄存器中的 ISPC 位设置为 1，清除 ISPR 寄存器，然后使用 PLMR 寄存器通过软件控制上限值。</p>
<p>(ii) PSW.EIMASK<br>只有在中断优先级级别扩展功能被启用时，中断确认由 PSW.EIMASK 判断。 PSW.EIMASK 屏蔽优先级低于或等于设定值的中断（EIINTn）。当 CPU 确认中断（EIINTn）时，其中断优先级被存储。当执行 EIRET 或 FERET 指令时，存储 EIPSW.EIMASK 或 FEPSW.EIMASK 的值。PSW.EIMASK 的设置可以通过 LDSR 指令更改。</p>
<p>(iii) PLMR<br>PLMR 屏蔽优先级低于或等于设定值的中断（EIINTn）。 PLMR 寄存器允许通过软件屏蔽特定的中断优先级。用它来在程序中临时提高中断上限优先级。ISPR 寄存器或 PSW.EIMASK 指定的屏蔽设置与 PLMR 的屏蔽设置可能重叠，如果被其中任何一个屏蔽，中断就会被屏蔽。通常，使用 PLMR 寄存器提高 ISPR 寄存器或 PSW.EIMASK 的上限值。 此外，使用 PLMR 寄存器时，可以通过 ICSR 寄存器检查是否有任何中断被 PLMR 寄存器屏蔽。</p>
<h6 id="1-5-返回和恢复"><a href="#1-5-返回和恢复" class="headerlink" title="1.5 返回和恢复"></a>1.5 返回和恢复</h6><p>当进行异常处理时，可能会影响被确认异常中断的原始程序。此影响从两个角度表示：“返回”和“恢复”。</p>
<ul>
<li>返回：表示原始程序是否可以从中断处重新执行。</li>
<li>恢复：表示处理器状态（如通用寄存器和系统寄存器的状态）是否可以恢复到原始程序中断时的状态。</li>
</ul>
<p>无法返回或恢复的异常（表 3.102 中标记为“否”）可能会导致返回 PC 丢失，使得无法通过返回指令从异常返回到原始处理。触发无法选择的异常是不可返回或不可恢复的异常。</p>
<p>对于不可恢复的异常，可以返回到原始程序流程。然而，由于在该点无法恢复发生异常前的状态，因此在继续后续程序操作时必须小心。</p>
<h6 id="1-6-上下文保存"><a href="#1-6-上下文保存" class="headerlink" title="1.6  上下文保存"></a>1.6  上下文保存</h6><p>为了在异常发生时保存当前程序序列，需根据功能定义适当地保存以下资源。某些资源由硬件自动保存，而某些资源需要由软件保存。</p>
<ul>
<li>程序计数器（PC）</li>
<li>程序状态字（PSW）</li>
<li>异常原因代码（EIIC、FEIC）</li>
<li>工作系统寄存器（EIWR、FEWR）</li>
</ul>
<p>使用哪种资源作为保存目标取决于异常类型。保存的资源确定如下所述。</p>
<p>对于使用寄存器组功能的异常，特定资源自动保存。有关详细信息，请参见第 3.2.4.5 节，寄存器组功能。</p>
<p>(a) 上下文保存<br>具有某些确认条件的异常在异常处理开始时可能不会被确认，这基于当另一个异常被确认时自动设置的挂起位（PSW. ID 和 NP 位）。</p>
<p>为了启用多重异常处理，使得同级别的异常再次可接受，必须保存返回寄存器和相应异常原因的某些信息，如保存到堆栈中。需要保存的这些信息称为“上下文”。</p>
<p>原则上，在保存上下文之前，必须确保不发生同级别的异常。</p>
<p>可以用于保存上下文工作并且其值保存以便根据需要处理多个异常的工作系统寄存器称为基本上下文寄存器。</p>
<p>这些基本上下文寄存器为每个异常级别提供。因此，当前异常的上下文在保存当前上下文之前发生不同级别的异常时不会被覆盖，因此可以精确地从当前异常返回。</p>
<table>
<thead>
<tr>
<th>异常级别</th>
<th>基本上下文寄存器</th>
</tr>
</thead>
<tbody><tr>
<td>EI 级别</td>
<td>EIPC, EIPSW, EIIC, EIWR</td>
</tr>
<tr>
<td>FE 级别</td>
<td>FEPC, FEPSW, FEIC, FEWR</td>
</tr>
</tbody></table>
<h5 id="2-确认异常时的操作"><a href="#2-确认异常时的操作" class="headerlink" title="2 确认异常时的操作"></a>2 确认异常时的操作</h5><p>检查在指令执行期间报告的每个异常是否根据优先级被确认。特定异常确认操作的步骤如下所示。</p>
<ol>
<li><p>检查是否满足确认条件以及异常是否根据其优先级被确认。</p>
</li>
<li><p>根据当前 PSW 值计算异常处理程序地址<sup>*1</sup>。</p>
</li>
<li><p>对于 FE 级别异常，执行以下处理：</p>
<ul>
<li>将 PC 保存到 FEPC</li>
<li>将 PSW 保存到 FEPSW</li>
<li>将异常原因代码存储在 FEIC</li>
<li>更新 PSW<sup>*2</sup></li>
<li>将步骤 (2) 中计算的异常处理程序地址存储在 PC 中，然后将控制传递给异常处理程序。</li>
</ul>
</li>
<li><p>对于 EI 级别异常，执行以下处理：</p>
<ul>
<li>将 PC 保存到 EIPC</li>
<li>将 PSW 保存到 EIPSW</li>
<li>将异常原因代码存储在 EIIC</li>
<li>更新 PSW<sup>*2</sup></li>
<li>将步骤 (2) 中计算的异常处理程序地址存储在 PC 中，然后将控制传递给异常处理程序。</li>
<li>当异常是使用寄存器组的中断时，自动保存上下文<sup>*3</sup>。</li>
</ul>
</li>
</ol>
<p>注意:</p>
<ul>
<li>*1：有关详细信息，请参见第 3.2.4.4 节，异常处理程序地址。 </li>
<li>*2：有关要更新的值，请参见表 3.102。 </li>
<li>*3：有关寄存器组的详细信息，请参见第 3.2.4.5 节，寄存器组功能。</li>
</ul>
<h6 id="2-1-特殊操作"><a href="#2-1-特殊操作" class="headerlink" title="2.1 特殊操作"></a>2.1 特殊操作</h6><p>(a) PSW 寄存器的 EP 位<br>如果中断被确认，则 PSW.EP 位被清除为 0。如果确认的是中断以外的异常，则 PSW.EP 位被设置为 1。</p>
<p>CPU 在执行 EIRET 和 FERET 指令时的操作取决于 EP 位的状态。如果 EP 位被清除为 0，CPU 会通知外部中断控制器异常处理例程的终止。此功能对于在返回中断时正确控制中断控制器中的请求标志和其他资源是必要的。当 EP 位被清除为 0 并执行 EIRET 指令时，ISPR.ISP15 到 ISPR.ISP0 中设置为 1 的位中优先级最高的位（0 是最高）被清除为 0。</p>
<p>要从中断返回，请确保在 EP 位清除为 0 时执行返回指令。</p>
<p>(b) 协处理器不可用异常<br>对于协处理器不可用异常，导致异常的操作码取决于 PSW 寄存器的 CU 位的状态。</p>
<p>当产品中不包含协处理器或其不可用时，如果尝试执行对应协处理器的协处理器指令，则会立即发生协处理器不可用异常（UCPOP）。如果 LDSR 或 STSR 指令尝试访问协处理器的系统寄存器，也会立即发生协处理器不可用异常（UCPOP）。</p>
<p>有关详细信息，请参见第 3.2.2.4 (3) 节，协处理器不可用异常。</p>
<p>(c) 保留指令异常<br>如果执行了为未来功能扩展保留且未定义任何指令的操作码，则会发生保留指令异常（RIE）。</p>
<p>始终产生保留指令异常的操作码定义为 RIE 指令。</p>
<p>(d) Reset<br>Reset与异常处理方式相同，但不被视为 EI 级别异常或 FE 级别异常。Reset操作与无确认条件的异常相同，但每个寄存器的值更改为重置后的值。此外，从重置返回到原始程序是不可能的。</p>
<p>与 CPU 初始化同时发生的所有异常都会被取消，即使在 CPU 初始化后也不会被确认。</p>
<p>有关详细信息，请参见第 3.2.8 节，Reset。</p>
<h5 id="3-从异常处理中返回"><a href="#3-从异常处理中返回" class="headerlink" title="3 从异常处理中返回"></a>3 从异常处理中返回</h5><p>要从异常处理中返回，请执行与相关异常级别对应的返回指令（EIRET 或 FERET）。</p>
<p>当上下文已保存（例如保存到堆栈）时，必须在执行返回指令之前恢复上下文。当从不可恢复的异常中返回执行时，无法恢复原始程序中发生异常前的状态。因此，执行结果可能与未发生异常时有所不同。</p>
<p>EIRET 指令用于从 EI 级别异常处理中返回，FERET 指令用于从 FE 级别异常处理中返回。</p>
<p>当执行 EIRET 或 FERET 指令时，CPU 执行以下处理，然后将控制传递到返回的 PC 地址。</p>
<ol>
<li><p>如果 PSW.EP 位被设置为 0，CPU 通知中断控制器异常处理例程的终止。</p>
</li>
<li><p>当在 PSW.EP &#x3D; 0 且 INTCFG.ISPC &#x3D; 0 时执行 EIRET 指令，CPU 更新 ISPR 寄存器。执行 FERET 指令时，CPU 不更新 ISPR 寄存器。</p>
</li>
<li><p>执行 EIRET 指令时，从 EIPC 和 EIPSW 寄存器加载返回的 PC 和 PSW。执行 FERET 指令时，从 FEPC 和 FEPSW 寄存器加载返回的 PC 和 PSW。</p>
</li>
<li><p>将控制传递到加载的返回 PC 指示的地址。</p>
</li>
</ol>
<p>图 3.19 显示了使用 EIRET 或 FERET 指令从异常处理中返回的流程。</p>
<p>希望这些翻译对你有帮助！如果你有任何其他问题或需要进一步的解释，请随时告诉我。</p>
<h5 id="4-异常处理程序地址"><a href="#4-异常处理程序地址" class="headerlink" title="4 异常处理程序地址"></a>4 异常处理程序地址</h5><p>对于此 CPU，在复位输入、异常确认或中断确认期间用于执行的异常处理程序地址可以根据设置进行更改。</p>
<h6 id="4-1-复位、异常和中断"><a href="#4-1-复位、异常和中断" class="headerlink" title="4.1 复位、异常和中断"></a>4.1 复位、异常和中断</h6><p>复位、异常和中断的异常处理程序地址通过直接向量方法确定，其中可以使用 PSW.EBV 位、RBASE 寄存器和 EBASE 寄存器更改异常处理程序地址的参考点。对于用户中断，还可以指定表引用方法。如果选择表引用方法，执行可以分支到内存中分配的异常处理程序表指示的地址。</p>
<p>(a) 直接向量方法<br>此 CPU 使用将表 3.105 中显示的偏移地址添加到 RBASE 或 EBASE 寄存器指示的基地址的结果作为异常处理程序地址。</p>
<p><strong>使用 RBASE 还是 EBASE 寄存器作为基地址是根据 PSW.EBV 位选择的</strong>。如果 PSW.EBV 位设置为 1，则使用 EBASE 寄存器值作为基地址。如果该位被清除为 0，则使用 RBASE 寄存器值作为基地址。</p>
<p>然而，复位输入始终引用 RBASE 寄存器。</p>
<p>此外，用户中断（EIINTn）引用选定基寄存器的 RINT 位，并根据该位的值减少偏移地址。<strong>如果 RBASE.RINT 位或 EBASE.RINT 位设置为 1，则所有用户中断使用 100H 的偏移地址进行处理</strong>。如果该位被清除为 0，则偏移地址根据表 3.105 确定。</p>
<p>(b) 表引用方法<br>在直接向量方法中，每个中断优先级都有一个用户中断异常处理程序，并且具有相同优先级的用户中断分支到相同的中断处理程序，但某些用户可能希望为每个中断处理程序使用不同的代码区域。</p>
<p>为了适应这些需求，此 CPU 定义了一种表引用方法。</p>
<p>1: 在以下任一情况下，异常处理程序地址使用直接向量方法确定：</p>
<ul>
<li>当中断通道设置不是表引用方法时。</li>
<li>当 PSW.EBV &#x3D; 0 且 RBASE.DV &#x3D; 1 时。</li>
<li>当 PSW.EBV &#x3D; 1 且 EBASE.DV &#x3D; 1 时。</li>
</ul>
<p>2: 除上述情况外，计算表读取位置： 异常处理程序地址读取位置 &#x3D; INTBP 寄存器 + 通道号 × 4 字节</p>
<p>3: 从步骤 (2) 中计算的异常处理程序地址读取位置开始读取字数据。</p>
<p>4: 使用步骤 (3) 中读取的字数据作为异常处理程序地址。</p>
<p>获取异常处理程序地址后，中断的接受得到确认。除了图 3.18 所示的异常接受处理外，CPU 返回接受响应给中断控制器并更新 ISPR。</p>
<p><strong>注意事项</strong>:</p>
<ul>
<li><p>有关中断通道设置的详细信息，请参见第 6 节，中断。</p>
</li>
<li><p>根据内存保护设置，在从异常处理程序地址读取位置读取字数据时，可能会发生内存保护异常 (MDP)。在这种情况下，中断的接受被暂时取消。由于没有返回接受响应给中断控制器，中断请求被挂起，并在从内存保护异常处理返回执行时重新变得可接受。</p>
</li>
<li><p>如果在从异常处理程序地址读取位置读取字数据时发生内存保护异常，被中断的指令的 PC 保存在 FEPC 中。由于中断的接受被取消，中断发生时建立的 PSW 值（应保存在 EIPSW 中）保存在 FEPSW 中。</p>
</li>
</ul>
<h6 id="4-2-系统调用"><a href="#4-2-系统调用" class="headerlink" title="4.2 系统调用"></a>4.2 系统调用</h6><p>对于系统调用异常，根据 SYSCALL 指令指定的向量值和 SCCFG.SIZE 位的值选择引用的表条目，并根据表条目的内容和 SCBP 寄存器值计算异常处理程序地址。</p>
<p>例如，如果 SCCFG.SIZE 指定的表大小为 n，则表条目按如下方式选择。注意，如果 SYSCALL 指令指定的向量（vector8）大于表大小 n，则向量 n+1 到 255 引用的表条目为表条目 0。</p>
<table>
<thead>
<tr>
<th>向量</th>
<th>异常原因代码</th>
<th>引用的表条目</th>
</tr>
</thead>
<tbody><tr>
<td>0</td>
<td>0000 8000H</td>
<td>表条目 0</td>
</tr>
<tr>
<td>1</td>
<td>0000 8001H</td>
<td>表条目 1</td>
</tr>
<tr>
<td>2</td>
<td>0000 8002H</td>
<td>表条目 2</td>
</tr>
<tr>
<td>…</td>
<td>…</td>
<td>…</td>
</tr>
<tr>
<td>n-1</td>
<td>0000 8000H + (n-1)H</td>
<td>表条目 n-1</td>
</tr>
<tr>
<td>n</td>
<td>0000 8000H + nH</td>
<td>表条目 n</td>
</tr>
<tr>
<td>n+1</td>
<td>0000 8000H + (n+1)H</td>
<td>表条目 0</td>
</tr>
<tr>
<td>…</td>
<td>…</td>
<td>…</td>
</tr>
<tr>
<td>254</td>
<td>0000 80FEH</td>
<td>表条目 0</td>
</tr>
<tr>
<td>255</td>
<td>0000 80FFH</td>
<td>表条目 0</td>
</tr>
</tbody></table>
<p><strong>注意</strong>：因为如果指定的向量超过 SCCFG.SIZE 指定的表大小时，表条目 0 被选择，因此请在表条目 0 处分配错误处理例程。</p>
<h5 id="5-寄存器组功能"><a href="#5-寄存器组功能" class="headerlink" title="5 寄存器组功能"></a>5 寄存器组功能</h5><p>此 CPU 提供寄存器组功能，当接受中断 (EIINTn) 时，自动保存上下文。由于上下文保存与中断接受处理并行进行，此功能使 CPU 能够实现高速中断响应。</p>
<h6 id="5-1-寄存器组功能概述"><a href="#5-1-寄存器组功能概述" class="headerlink" title="5.1 寄存器组功能概述"></a>5.1 寄存器组功能概述</h6><p>此 CPU 提供的寄存器组功能具有以下特点：</p>
<ul>
<li>在满足某些条件时（见第 3.2.4.5 (2) 节，自动上下文保存），在接受中断 (EIINTn) 时自动保存上下文。</li>
<li>上下文保存的目标不是专用内存，而是安装在此 CPU 中的普通内存区域（由 RBIP 寄存器指定）。</li>
<li>要保存的上下文可以从两组中选择（由 RBCR0.MD 位指定）。</li>
<li>支持最多 64 级多重中断（RBNR.BN 位指示已接受中断的数量）。</li>
<li></li>
<li>上下文通过执行 RESBANK 指令从寄存器组中恢复（没有自动恢复功能）。</li>
</ul>
<h6 id="5-2-自动上下文保存"><a href="#5-2-自动上下文保存" class="headerlink" title="5.2 自动上下文保存"></a>5.2 自动上下文保存</h6><p>当通知的中断请求 (EIINTn) 满足以下条件时，进行自动上下文保存：</p>
<ul>
<li><p>为中断请求指定了表引用方法<sup>*1</sup>。</p>
</li>
<li><p>寄存器组的使用由 RBCR0.BE[i] 位指定，该位与中断请求的优先级 (i) 相关联<sup>*2</sup>（启用自动上下文保存到寄存器组）。</p>
</li>
<li><p>RBNR.BN 位的值不大于 INTCFG.ULNR 的值<sup>*3</sup>（检查正在使用的寄存器组数量）。</p>
</li>
</ul>
<p>注意：</p>
<ul>
<li>*1：有关指定表引用方法的步骤，请参见第 6 节，中断。 </li>
<li>*2：所有优先级小于等于 16 的中断 (EIINTn) 的上下文自动保存由 RBCR0.BE[15] 指定。 </li>
<li>*3：如果 RBNR.BN 的值大于 INTCFG.ULNR 或 RBNR.BN 的值为 63，则不进行上下文自动保存。在这种情况下，异常因素代码（低 16 位）为 1CH 的 SYSERR 异常发生。</li>
</ul>
<p>如果未为中断请求 (EIINTn) 指定表引用方法，或者未由与中断优先级 (i) 相关联的 RBCR0.BE[i] 位指定寄存器组的使用，则不进行自动上下文保存。</p>
<p>此外，如果 RBNR.BN 位的值大于 INTCFG.ULNR，或者 RBNR.BN 的值为 63，则不进行自动上下文保存。在这种情况下，假设正在执行意外的中断接受处理，并通知进行错误处理的终止型 SYSERR 异常。</p>
<p>(a) 自动上下文保存<br>以下是保存上下文到寄存器组的处理过程：</p>
<ol>
<li><p>根据寄存器组初始指针（RBIP）和接受中断时建立的寄存器组编号寄存器（RBNR）的 BN 位的值 (n) 计算上下文保存的寄存器组 n 的起始地址。寄存器组的大小 (BANK_SIZE) 取决于选择的保存模式。<br>起始地址：RBIP – n × BANK_SIZE<br>BANK_SIZE:</p>
<ul>
<li>保存模式 0：60H</li>
<li>保存模式 1：90H</li>
</ul>
</li>
<li><p>根据 RBCR0.MD 位指定的保存模式<sup>*1</sup>，按照 RBNR.BN 位指定的寄存器组 n 保存目标寄存器。</p>
</li>
<li><p>将 RBNR.BN 位的值加 1。这终止寄存器组保存处理<sup>*2</sup>，并开始执行中断处理程序<sup>*3</sup>。</p>
</li>
</ol>
<p>注意事项</p>
<ul>
<li>*1：在寄存器组保存处理过程中进行的内存访问可能导致内存保护异常 (MDP)（终止型）。其他类型的中断和异常无法被接受。</li>
<li>*2：不一定完成将寄存器保存到指定为寄存器组的内存区域。为了确保寄存器保存的完成，此 CPU 可以采用类似于普通存储指令的过程。有关详细信息，请参见第 3.2.7.2 节，保证存储指令的完成。</li>
<li>*3：在保存到寄存器组后，可以接受较高优先级的异常。</li>
</ul>
<p>以下是保存和恢复寄存器的地址、保存顺序和恢复顺序的列表：</p>
<p>表 3.108 要保存的寄存器、地址、保存顺序和恢复顺序<br>markdown</p>
<table>
<thead>
<tr>
<th>地址</th>
<th>保存模式 0 (MD &#x3D; 0)</th>
<th>保存模式 1 (MD &#x3D; 1)</th>
<th>保存顺序</th>
<th>恢复顺序</th>
</tr>
</thead>
<tbody><tr>
<td>RBIP - n × BANK_SIZE</td>
<td></td>
<td></td>
<td><em>1，</em>2</td>
<td><em>1，</em>3</td>
</tr>
<tr>
<td>-04H</td>
<td>PC</td>
<td>PC</td>
<td>1</td>
<td>24 &#x2F; 35</td>
</tr>
<tr>
<td>-08H</td>
<td>PSW</td>
<td>PSW</td>
<td>2</td>
<td>23 &#x2F; 34</td>
</tr>
<tr>
<td>-0CH</td>
<td>EIIC</td>
<td>EIIC</td>
<td>3</td>
<td>22 &#x2F; 33</td>
</tr>
<tr>
<td>-10H</td>
<td>FPSR</td>
<td>FPSR</td>
<td>4</td>
<td>21 &#x2F; 32</td>
</tr>
<tr>
<td>-14H</td>
<td>r1</td>
<td>r1</td>
<td>5</td>
<td>20 &#x2F; 31</td>
</tr>
<tr>
<td>-18H</td>
<td>r2</td>
<td>r2</td>
<td>6</td>
<td>19 &#x2F; 30</td>
</tr>
<tr>
<td>-1CH</td>
<td>r3</td>
<td>r3</td>
<td>7</td>
<td>18 &#x2F; 29</td>
</tr>
<tr>
<td>-20H</td>
<td>r4</td>
<td>r4</td>
<td>8</td>
<td>17 &#x2F; 28</td>
</tr>
<tr>
<td>-24H</td>
<td>r5</td>
<td>r5</td>
<td>9</td>
<td>16 &#x2F; 27</td>
</tr>
<tr>
<td>-28H</td>
<td>r6</td>
<td>r6</td>
<td>10</td>
<td>15 &#x2F; 26</td>
</tr>
<tr>
<td>-2CH</td>
<td>r7</td>
<td>r7</td>
<td>11</td>
<td>14 &#x2F; 25</td>
</tr>
<tr>
<td>-30H</td>
<td>r8</td>
<td>r8</td>
<td>12</td>
<td>13 &#x2F; 24</td>
</tr>
<tr>
<td>-34H</td>
<td>r9</td>
<td>r9</td>
<td>13</td>
<td>12 &#x2F; 23</td>
</tr>
<tr>
<td>-38H</td>
<td>r10</td>
<td>r10</td>
<td>14</td>
<td>11 &#x2F; 22</td>
</tr>
<tr>
<td>-3CH</td>
<td>r11</td>
<td>r11</td>
<td>15</td>
<td>10 &#x2F; 21</td>
</tr>
<tr>
<td>-40H</td>
<td>r12</td>
<td>r12</td>
<td>16</td>
<td>9 &#x2F; 20</td>
</tr>
<tr>
<td>-44H</td>
<td>r13</td>
<td>r13</td>
<td>17</td>
<td>8 &#x2F; 19</td>
</tr>
<tr>
<td>-48H</td>
<td>r14</td>
<td>r14</td>
<td>18</td>
<td>7 &#x2F; 18</td>
</tr>
<tr>
<td>-4CH</td>
<td>r15</td>
<td>r15</td>
<td>19</td>
<td>6 &#x2F; 17</td>
</tr>
<tr>
<td>-50H</td>
<td>r16</td>
<td>r16</td>
<td>20</td>
<td>5 &#x2F; 16</td>
</tr>
<tr>
<td>-54H</td>
<td>r17</td>
<td>r17</td>
<td>21</td>
<td>4 &#x2F; 15</td>
</tr>
<tr>
<td>-58H</td>
<td>r18</td>
<td>r18</td>
<td>22</td>
<td>3 &#x2F; 14</td>
</tr>
<tr>
<td>-5CH</td>
<td>r19</td>
<td>r19</td>
<td>23</td>
<td>2 &#x2F; 13</td>
</tr>
<tr>
<td>-60H</td>
<td>r30</td>
<td>r20</td>
<td>24</td>
<td>1 &#x2F; 12</td>
</tr>
<tr>
<td>-64H</td>
<td>*4</td>
<td>r21</td>
<td>25</td>
<td>11</td>
</tr>
<tr>
<td>-68H</td>
<td></td>
<td>r22</td>
<td>26</td>
<td>10</td>
</tr>
<tr>
<td>-6CH</td>
<td></td>
<td>r23</td>
<td>27</td>
<td>9</td>
</tr>
<tr>
<td>-70H</td>
<td></td>
<td>r24</td>
<td>28</td>
<td>8</td>
</tr>
<tr>
<td>-74H</td>
<td></td>
<td>r25</td>
<td>29</td>
<td>7</td>
</tr>
<tr>
<td>-78H</td>
<td></td>
<td>r26</td>
<td>30</td>
<td>6</td>
</tr>
<tr>
<td>-7CH</td>
<td></td>
<td>r27</td>
<td>31</td>
<td>5</td>
</tr>
<tr>
<td>-80H</td>
<td></td>
<td>r28</td>
<td>32</td>
<td>4</td>
</tr>
<tr>
<td>-84H</td>
<td></td>
<td>r29</td>
<td>33</td>
<td>3</td>
</tr>
<tr>
<td>-88H</td>
<td></td>
<td>r30</td>
<td>34</td>
<td>2</td>
</tr>
<tr>
<td>-8CH</td>
<td></td>
<td>r31</td>
<td>35</td>
<td>1</td>
</tr>
<tr>
<td>-90H</td>
<td></td>
<td>*5</td>
<td></td>
<td></td>
</tr>
<tr>
<td>-94H</td>
<td></td>
<td>*6</td>
<td></td>
<td></td>
</tr>
</tbody></table>
<p>注意：</p>
<ul>
<li>*1：寄存器保存和恢复按顺序编号 1 依次开始。</li>
<li>*2：在保存模式 0 (RBCR0.MD &#x3D; 0) 中，要保存的目标寄存器，是寄存器到r30，保存序列号为24。</li>
<li>*3：左侧显示的恢复顺序编号适用于保存模式 0，右侧显示的适用于保存模式 1。</li>
<li>*4：在保存模式 0 中，下一寄存器组 (n + 1) 从此地址开始。</li>
<li>*5：在保存模式 1 中，此地址不保存任何寄存器。此地址不使用。</li>
<li>*6：在保存模式 1 中，下一寄存器组 (n + 1) 从此地址开始。</li>
</ul>
<p>(b) 抑制 PSW.ID 位的更新<br>在正常状态下接受中断 (EIINTn) 时，PSW.ID 位被设置为 1，并且除非通过 EI 指令显式启用中断接受，否则同一 EI 级别的中断无法被接受。</p>
<p>对于使用寄存器组的中断（满足自动上下文保存条件），通过将与中断优先级 (i) 相关联的 RBCR1.NC[i] 位清除为 0，接受中断时 PSW.ID 位保持为 0 而不会被设置为 1。这使得在自动上下文保存结束后，无需软件干预即可接受更高优先级的中断。由于必要的寄存器被自动保存，CPU 可以准确地返回到原始中断处理。</p>
<p>注意：接受中断后，所有优先级小于等于 16 的中断 (EIINTn) 的 PSW.ID 位由 RBCR1.NC[15] 定义。</p>
<h6 id="5-3-上下文恢复"><a href="#5-3-上下文恢复" class="headerlink" title="5.3 上下文恢复"></a>5.3 上下文恢复</h6><p>自动保存到寄存器组的上下文需要在从中断处理返回到原始程序之前恢复。尽管上下文保存到寄存器组是自动完成的，<strong>但其恢复需要通过软件显式执行 RESBANK 指令来完成</strong>。</p>
<p>(a) 执行 RESBANK 指令的条件<br>必须执行 RESBANK 指令以从寄存器组恢复上下文。RESBANK 指令是监督特权指令。如果在用户模式下执行，则会发生 PIE 异常。</p>
<p>如果在 RBNR.BN 位的值为 0 时执行 RESBANK 指令，则会发生可恢复类型的 SYSERR 异常。RBNR.BN 位的值为 0 意味着没有上下文自动保存到寄存器组中。因此，如果在这种情况下执行 RESBANK 指令，将恢复无效值。</p>
<p>(b) 上下文恢复</p>
<p>RESBANK 指令从寄存器组恢复上下文的处理过程如下：</p>
<ol>
<li><p>根据寄存器组初始指针 (RBIP) 的值和接受中断时建立的寄存器组编号寄存器 (RBNR) 的 BN 位的值 (n) 计算上下文恢复的寄存器组 n-1 的起始地址。与保存上下文的情况不同，恢复上下文时引用的起始地址是寄存器组地址的下限。寄存器组的大小 (BANK_SIZE) 取决于选择的保存模式。</p>
<p>起始地址：RBIP – n × BANK_SIZE<br>BANK_SIZE:</p>
<ul>
<li>保存模式 0：60H</li>
<li>保存模式 1：90H</li>
</ul>
</li>
<li><p>根据 RBCR0.MD 位指定的保存模式，从寄存器组 n-1 恢复目标寄存器中的上下文<sup>*1<sup>。</sup></sup></p>
</li>
<li><p>将 RBNR.BN 位的值减 1<sup>*2</sup>。终止寄存器组恢复处理，并完成 RESBANK 指令的执行<sup>3</sup>。</p>
</li>
</ol>
<p>注意事项：</p>
<ul>
<li><p>*1：CPU 在从寄存器组恢复上下文时可以接受终止型异常。内存访问可能导致内存保护异常 (MDP)（可恢复类型）。</p>
</li>
<li><p>*2：当 CPU 在 RBNR.BN 的值更新之前接受异常时，即使尚未完成所有寄存器的恢复，也会停止执行 RESBANK 指令。在这种情况下，尽管有些寄存器的恢复已完成，但 CPU 无法知道哪些寄存器已恢复。由于异常的返回 PC 是 RESBANK 指令的 PC，如果在异常处理期间没有更改与 RESBANK 指令相关的资源，CPU 可以精确地重新执行 RESBANK 指令。</p>
</li>
<li><p>*3：在执行 RESBANK 指令后，执行 EIRET 指令以从中断处理程序返回。</p>
</li>
</ul>
<h5 id="6-内存访问异常列表"><a href="#6-内存访问异常列表" class="headerlink" title="6 内存访问异常列表"></a>6 内存访问异常列表</h5><p>表 3.109 显示了进行内存访问的指令和异常列表以及可以检测到的异常。标有符号“✔”的异常可以在处理列出的指令和异常期间的内存访问中检测到。标有符号“×”的异常无法检测到。</p>
<table>
<thead>
<tr>
<th>指令&#x2F;异常</th>
<th>MAE</th>
<th>MDP</th>
<th>指令&#x2F;异常</th>
<th>MAE</th>
<th>MDP</th>
</tr>
</thead>
<tbody><tr>
<td>SLD.B</td>
<td>×</td>
<td>✔</td>
<td>PREPARE</td>
<td>×</td>
<td>✔</td>
</tr>
<tr>
<td>SLD.BU</td>
<td>×</td>
<td>✔</td>
<td>DISPOSE</td>
<td>×</td>
<td>✔</td>
</tr>
<tr>
<td>SLD.H</td>
<td>✔</td>
<td>✔</td>
<td>PUSHSP</td>
<td>×</td>
<td>✔</td>
</tr>
<tr>
<td>SLD.HU</td>
<td>✔</td>
<td>✔</td>
<td>POPSP</td>
<td>×</td>
<td>✔</td>
</tr>
<tr>
<td>SLD.W</td>
<td>✔</td>
<td>✔</td>
<td>STM.MP</td>
<td>×</td>
<td>✔</td>
</tr>
<tr>
<td>SST.B</td>
<td>×</td>
<td>✔</td>
<td>LDM.MP</td>
<td>×</td>
<td>✔</td>
</tr>
<tr>
<td>SST.H</td>
<td>✔</td>
<td>✔</td>
<td>SWITCH</td>
<td>×</td>
<td>✔</td>
</tr>
<tr>
<td>SST.W</td>
<td>✔</td>
<td>✔</td>
<td>CALLT</td>
<td>×</td>
<td>✔</td>
</tr>
<tr>
<td>LD.B</td>
<td>×</td>
<td>✔</td>
<td>SYSCALL</td>
<td>×</td>
<td>✔</td>
</tr>
<tr>
<td>LD.BU</td>
<td>×</td>
<td>✔</td>
<td>LDV.W</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>LD.H</td>
<td>✔</td>
<td>✔</td>
<td>LDV.DW</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>LD.HU</td>
<td>✔</td>
<td>✔</td>
<td>LDV.QW</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>LD.W</td>
<td>✔</td>
<td>✔</td>
<td>STV.W</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>LD.DW</td>
<td>✔</td>
<td>✔</td>
<td>STV.DW</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>ST.B</td>
<td>×</td>
<td>✔</td>
<td>STV.QW</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>ST.H</td>
<td>✔</td>
<td>✔</td>
<td>LDVZ.H4</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>ST.W</td>
<td>✔</td>
<td>✔</td>
<td>STVZ.H4</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>ST.DW</td>
<td>✔</td>
<td>✔</td>
<td>CACHE (CHBII)</td>
<td>×</td>
<td>✔</td>
</tr>
<tr>
<td>LDL.BU</td>
<td>×</td>
<td>✔</td>
<td>CACHE (CIBII)</td>
<td>×</td>
<td>×</td>
</tr>
<tr>
<td>LDL.HU</td>
<td>✔</td>
<td>✔</td>
<td>CACHE (CFALI)</td>
<td>×</td>
<td>✔</td>
</tr>
<tr>
<td>LDL.W</td>
<td>✔</td>
<td>✔</td>
<td>CACHE (CISTI)</td>
<td>×</td>
<td>×</td>
</tr>
<tr>
<td>STC.B</td>
<td>×</td>
<td>✔</td>
<td>CACHE (CILDI)</td>
<td>×</td>
<td>×</td>
</tr>
<tr>
<td>STC.H</td>
<td>✔</td>
<td>✔</td>
<td>CACHE (其他命令)</td>
<td>×</td>
<td>×</td>
</tr>
<tr>
<td>STC.W</td>
<td>✔</td>
<td>✔</td>
<td>PREF (PREFI)</td>
<td>×</td>
<td>×<sup>*1</sup></td>
</tr>
<tr>
<td>CAXI</td>
<td>✔</td>
<td>✔</td>
<td>PREF (其他命令)</td>
<td>×</td>
<td>×</td>
</tr>
<tr>
<td>SET1</td>
<td>×</td>
<td>✔</td>
<td>表引用类型 EIINTn</td>
<td>×</td>
<td>✔ <sup>*2</sup></td>
</tr>
<tr>
<td>CLR1</td>
<td>×</td>
<td>✔</td>
<td>寄存器组保存处理</td>
<td>×</td>
<td>✔ <sup>*2</sup></td>
</tr>
<tr>
<td>NOT1</td>
<td>×</td>
<td>✔</td>
<td>RESBANK</td>
<td>×</td>
<td>✔</td>
</tr>
<tr>
<td>TST1</td>
<td>×</td>
<td>✔</td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody></table>
<p>注意:</p>
<ul>
<li>*1：在执行 PREF 指令期间检测到违规时，不会生成 MDP 异常，但会抑制内存访问。不执行读取访问。</li>
<li>*2：由于表引用方法中断的表读取访问和自动将上下文保存到寄存器组的写入访问都独立于指令的执行发生。此 CPU 将这些访问引起的任何 MDP 异常视为终止型异常。此 MDP 异常的异常原因代码与可恢复型 MDP 异常的原因代码不同。有关详细信息，请参见表 3.102。</li>
</ul>

    </div>

    
    
    

    <footer class="post-footer">
          

<div class="post-copyright">
<ul>
  <li class="post-copyright-author">
      <strong>本文作者： </strong>feng xun
  </li>
  <li class="post-copyright-link">
      <strong>本文链接：</strong>
      <a href="http://fengxun2017.github.io/2025/01/04/Renesas-CPU_System-CPU-Exceptions_and_Interrupts/" title="Renesas-RH850  CPU System - CPU -  Exceptions and Interrupts">http://fengxun2017.github.io/2025/01/04/Renesas-CPU_System-CPU-Exceptions_and_Interrupts/</a>
  </li>
  <li class="post-copyright-license">
    <strong>版权声明： </strong>本博客所有文章除特别声明外，均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh" rel="noopener" target="_blank"><i class="fab fa-fw fa-creative-commons"></i>BY-NC-SA</a> 许可协议。转载请注明出处！
  </li>
</ul>
</div>


        

          <div class="post-nav">
            <div class="post-nav-item">
                <a href="/2025/01/04/Renesas-CPU_System-CPU-Memory_Management/" rel="prev" title="Renesas-RH850  CPU System - CPU -  Memory Management">
                  <i class="fa fa-chevron-left"></i> Renesas-RH850  CPU System - CPU -  Memory Management
                </a>
            </div>
            <div class="post-nav-item">
                <a href="/2025/01/06/Renesas-CPU_System-CPU-Coprocessor/" rel="next" title="Renesas-RH850  CPU System - CPU - Coprocessor">
                  Renesas-RH850  CPU System - CPU - Coprocessor <i class="fa fa-chevron-right"></i>
                </a>
            </div>
          </div>
    </footer>
  </article>
</div>






</div>
  </main>

  <footer class="footer">
    <div class="footer-inner">


<div class="copyright">
  &copy; 
  <span itemprop="copyrightYear">2025</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">feng xun</span>
</div>
<div class="wordcount">
  <span class="post-meta-item">
    <span class="post-meta-item-icon">
      <i class="fa fa-chart-line"></i>
    </span>
      <span>站点总字数：</span>
    <span title="站点总字数">552k</span>
  </span>
  <span class="post-meta-item">
    <span class="post-meta-item-icon">
      <i class="fa fa-coffee"></i>
    </span>
      <span>站点阅读时长 &asymp;</span>
    <span title="站点阅读时长">11:30</span>
  </span>
</div>
  <div class="powered-by">由 <a href="https://hexo.io/" rel="noopener" target="_blank">Hexo</a> & <a href="https://theme-next.js.org/muse/" rel="noopener" target="_blank">NexT.Muse</a> 强力驱动
  </div>

    </div>
  </footer>

  
  <script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.1/anime.min.js" integrity="sha256-XL2inqUJaslATFnHdJOi9GfQ60on8Wx1C2H8DYiN1xY=" crossorigin="anonymous"></script>
<script src="/js/comments.js"></script><script src="/js/utils.js"></script><script src="/js/motion.js"></script><script src="/js/schemes/muse.js"></script><script src="/js/next-boot.js"></script>

  





  





</body>
</html>
